//---------------------------------------------------------数学运算符中的类型转换------------------------------------------------------------------
// 1. 减 乘 除： 在对各种非Number类型运用减乘除时，会先将非Number类型转换为Number类型
console.log('5' - 0);  // 5
console.log(2 * [5]);  // 10 [涉及到拆箱操作]

// 2. 加法特殊性： JS中+可以用来拼接字符串
    /*
        1) 当一侧为String类型，字符串拼接
        2) 当一侧为Number类型，另一侧为原始类型，将原始类型转换为Number类型
        3) 当一侧为Number类型，另一侧为引用类型，将引用类型和Number类型转换为字符串后拼接
    */

console.log(1 + 'hello');  // 1hello
console.log(1 + true);  // 2








// --------------------------------------------------------------逻辑语句中的类型转换-----------------------------------------------------------------
    /*
        当我们使用 if while for 语句时，我们期望表达式是一个Boolean，所以一定伴随着隐式类型转换
    */
// 1. 单个变量：转换为boolean
    /*
        只有 null undefined '' NaN 0 false 这几个是 false，其他的情况都是 true，比如 {} , []
    */

// 2. 判断语句
    /*
        规则1：NaN和其他任何类型比较永远返回false（包括和他自己）
        规则2：Boolean 和其他任何类型比较，Boolean 首先被转换为 Number 类型
        规则3：String和Number比较，先将String转换为Number类型
        规则4：null == undefined比较结果是true，除此之外，null、undefined和其他任何结果的比较值都为false
        规则5：原始类型和引用类型做比较时，引用类型会依照ToPrimitive规则转换为原始类型
            /
                ToPrimitive规则，是引用类型向原始类型转变的规则，它遵循先valueOf后toString的模式期望得到一个原始类型
                如果还是没法得到一个原始类型，就会抛出 TypeError
            /
                '[object Object]' == {} 
                // true, 对象和字符串比较，对象通过 toString 得到一个基本类型值
                '1,2,3' == [1, 2, 3] 
                // true, 同上  [1, 2, 3]通过 toString 得到一个基本类型值
    
    */

// ------------------------------------------------------------题目练习--------------------------------------------------------------------------------
// 1
console.log([] == ![]);  // true

    /*
        Step1: ![] 转换为 false
        Step2: [] == 0
        Step3: []的valueof 是0 
        Step4： 0 == 0 true!
    */

// 2
console.log([undefined] == false)

    /*
        Step1: [undefined] toString ''
        Step2: '' == false
        Step3: '' == 0
        Step4: 0 == 0  true!
    */

